﻿using System;
using myConection;
using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// 语音识别音频可视化
/// </summary>
public class UseMicrophone : MonoBehaviour
{
    //todp:这个后期需要移动到view中
    public GameObject[] obj;//立方体--UI

    public static float volume;//音量
    public string defaultMic;
    private AudioClip micRecord;//麦克风
    private string[] device;//麦克风设备名
    private int micNum = 0;//麦克风数量,当用户不止一个麦克风时会用到
    private connection connection;
    private GameObject conObj;
    private Text micInfo;

    void Awake()
    {

    }
    void Start()
    {
        conObj = GameObject.Find("GameObject");
        micInfo = GameObject.Find("micInfo").GetComponent<Text>();

        connection = (connection)conObj.GetComponent(typeof(connection));
        device = new String[Microphone.devices.GetLength(0) + 1];
        try
        {
            if (Microphone.devices.GetLength(0) > 0)
            {
                for (int i = 0; i < Microphone.devices.GetLength(0); i++)
                {
                    Debug.Log("mic:" + Microphone.devices[i]);

                }
                micNum = Microphone.devices.GetLength(0);
                device[0] = Microphone.devices[0];//获取设备麦克风,暂时默认获取第一个麦克风
                //如果用户在编辑器中指定了麦克风,就直接使用
                if (defaultMic != null)
                {
                    device[0] = defaultMic;
                }

                micRecord = Microphone.Start(device[0], true, 999, 44100);//44100音频采样率   固定格式
                micInfo.text = "mic:" + Microphone.devices[0];
            }
            else
            {
                Debug.Log("未找到任何可用麦克风");
                micInfo.text = "未找到任何可用麦克风";

            }
        }
        catch (Exception e)
        {
            Debug.Log(e);
        }
    }
    void Update()
    {
        if (micNum > 0)
        {
            volume = GetMaxVolume();//得到最大音量
        }
        if (Input.GetKey(KeyCode.Escape))
        {
            Application.Quit();
        }
    }

    /// <summary>
    /// 在关闭程序时关闭麦克风
    /// </summary>
    void OnDestroy()
    {
        Microphone.End(device[0]);
    }
    //todo:这个控制UI的代码后期需要移动到view中
    /// <summary>
    /// 根据音量来设置立方体波动
    /// 得到最大音量
    /// </summary>
    /// <returns></returns>
    float GetMaxVolume()
    {
        float maxVolume = 0f;//初始化
        //剪切音频
        float[] volumeData = new float[128];//128大小
        int offset = Microphone.GetPosition(device[0]) - 128 + 1;//音频数据
        if (offset < 0)
        {
            return 0;
        }
        micRecord.GetData(volumeData, offset);//音频数据放到volumeData
        //遍历volumeData
        for (int i = 0; i < 128; i++)
        {
            float tempMax = volumeData[i];//修改音量的敏感值
            //这个if是用来取记录的音频的一部分   和你所加的物体有关  ----就是剪切（每4个为单位剪切）
            if (i % 4 == 0)
            {
                int f = i / 4;

                obj[f].gameObject.transform.localScale = new Vector3(0.3f, volumeData[i] * 10 + 0.2f, 0.1f);//将可视化的物体和音波相关联  改变y轴的scale
            }
            if (maxVolume < tempMax)//得到最大的音量
            {
                maxVolume = tempMax;
            }

        }
        return maxVolume;
    }
}